/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package finalED.dataStructures.Hashing;

import finalED.model.Escuela;

/**
 *
 * @author Diego
 */
public class TablaHash {

    /** Size of Hash table*/
    private int TamTabla;
    /**Number of elements in the Hash table */
    private int numElementos;
    /** Hash Table*/
    private Escuela[] tabla;
    
    /**
     * Constructor of the Hash Table
     * 
     * 
     * @param tam 
     */
    public TablaHash(int tam) {
        TamTabla=tam;
        tabla = new Escuela[TamTabla];
        for (int j = 0; j < TamTabla; j++) {
            tabla[j] = null;
        }
        numElementos = 0;
    }
    
    /**
     * Create a long number to make a position in the hash table
     * @param clave
     * @return d
     */
    long transformaCadena(String clave) {
        long d;
        d = 0;
        for (int j = 0; j < Math.min(10, clave.length()); j++) {
            d = d * 27 + (int) clave.charAt(j);
        }
        if (d < 0) {
            d = -d;
        }
        return d;
    }

    /**
     * Create the position of the String.
     * @param clave to get a position
     * @return p
     */
    public int direccion(String clave) {
        int i = 0, p;
        long d;
        d = transformaCadena(clave);
        p = (int) (d % TamTabla);
        while (tabla[p] != null && !tabla[p].getClaveEscuela().equals(clave)) {
            i++;
            p = p + (i * i);
            p = p % TamTabla;
        }
        return p;

    }


    /**
     * Search an Object in the hash table
     * @param clave
     * @return esc
     */
    public Escuela buscar(String clave) {
        Escuela esc;
        int posicion;
        posicion = direccion(clave);
        esc = tabla[posicion];
        if (esc != null) {
            if (esc.getClaveEscuela().equals(clave)) {
                return esc;
            }
        }
        esc=null;
        return esc;
    }

    /**
     * Delete an Object in the hash table
     * @param clave
     */
    public void eliminar(String clave) {
        int posicion;
        posicion = direccion(clave);
        if (tabla[posicion] != null) {
            tabla[posicion]= null;
        }
    }

    /*
     * Insert an Object in the hash table
     * @param esc
     */
    public void insertar(Escuela esc) {
        int posicion;
        posicion = direccion(esc.getClaveEscuela());
        tabla[posicion] = esc;
        numElementos++;
    }
    
    
    public static void main(String[] args) {
        Escuela a = new Escuela("Yucatan", "20KNP0001X", "Juanito", 123);
        Escuela b = new Escuela("Caracas", "20KNP0002X", "Pancho", 123);
        Escuela c = new Escuela("Salvador", "01PES0057V", "Pedro", 123);
        Escuela d = new Escuela("Perro", "19PPR0904N", "Pablo", 123);
        
        TablaHash th = new TablaHash(5);
        System.out.println(th.direccion(a.getClaveEscuela()));
                th.insertar(a);
        System.out.println(th.direccion(b.getClaveEscuela()));
                th.insertar(b);
        System.out.println(th.direccion(c.getClaveEscuela()));
                th.insertar(c);
        System.out.println(th.direccion(d.getClaveEscuela()));
                th.insertar(d);
        
        if(th.buscar(a.getClaveEscuela())!=null)
            System.out.println("Encontrado");
        
        if(th.buscar(b.getClaveEscuela())!=null)
            System.out.println("Encontrado");
        
        if(th.buscar(c.getClaveEscuela())!=null)
            System.out.println("Encontrado");
        
        if(th.buscar(d.getClaveEscuela())!=null)
            System.out.println("Encontrado");
        
        System.out.println(th.buscar(a.getClaveEscuela()).getNombreEscuela());
        System.out.println(th.buscar(b.getClaveEscuela()).getNombreEscuela());
        System.out.println(th.buscar(c.getClaveEscuela()).getNombreEscuela());
        System.out.println(th.buscar(d.getClaveEscuela()).getNombreEscuela());
    }


}
